package com.etime.shycourse.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.etime.shy.common.BaseMessage;
import com.etime.shy.common.ListMessage;
import com.etime.shy.common.PojoMessage;
import com.etime.shycourse.config.PageMessage;
import com.etime.shycourse.dto.CourseAndCourseTypeDto;
import com.etime.shycourse.dto.CourseOfflineDto;
import com.etime.shycourse.dto.CourseOfflineshowattrconfigDto;
import com.etime.shycourse.pojo.Course;
import com.etime.shycourse.services.interfaces.CourseServices;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;


/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author wb
 * @since 2021-12-17
 */
@Api(tags = "课程管理数据接口")
@RestController
@RequestMapping("/sys/course")
public class CourseController {
    @Autowired
    private CourseServices service;

    @ApiOperation("查询离职拥有的课程列表信息 教师离职管理可以用")
    @ApiImplicitParam("根据教师teacherId")
    @GetMapping("/list/{teacherId}")
    public ListMessage<Course> selectCourseListById(@PathVariable Integer teacherId) {
        List<Course> courseList = service.selectCourseTeacherById(teacherId);
        ListMessage<Course> msg = new ListMessage<>();
        if (courseList != null) {
            msg.setCode(1);
            msg.setDatalist(courseList);
        } else {
            msg.setCode(0);
            msg.setMsg("没有指定教师的数据");
        }
        return msg;
    }


    @ApiOperation("根据 课程id(courseid)查询出一条数据")
    @ApiImplicitParam("进行大类页面的数据展示")
    @GetMapping("/get/{courseId}")
    public PojoMessage<Course> selectCourseById(@PathVariable Integer courseId) {
        PojoMessage<Course> msg = new PojoMessage<>();
        Course course = service.selectCourseById(courseId);
        if (course != null) {
            msg.setCode(1);
            msg.setData(course);
        } else {
            msg.setCode(0);
            msg.setMsg("没有找到课程类型");
        }
        return msg;
    }

    @ApiOperation("根据课程id（courseId） 获取课程的总课时数量 ")
    @GetMapping("/LessonNum/get/{courseId}")
    public BaseMessage selectCourseLessonNum(@PathVariable Integer courseId) {
        BaseMessage msg = new PojoMessage<>();
        Integer i = service.selectCourseLessonNum(courseId);
        if (i != 0) {
            msg.setCode(i);
            msg.setMsg("找到该课程的总课时数量");
        } else {
            msg.setCode(0);
            msg.setMsg("没有找到该课程的总课时数量");
        }
        return msg;
    }

    /**
     * 教师课程列表 数据接口
     */
    @ApiOperation("教师课程分页查询列表 ")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "没有加中文的可不填", value = "注意中文注解"),
            @ApiImplicitParam(name = "pagenum", value = "第几页"),
            @ApiImplicitParam(name = "pagesize", value = "每页多少行"),
            // 复用
            @ApiImplicitParam(name = "coursetitle", value = "非必要条件 模糊查询 课程名 coursetitle"),
            @ApiImplicitParam(name = "coursetypeid", value = "非必要条件 课程类型查询  coursetype中的id"),
            @ApiImplicitParam(name = "courseteachername", value = "非必要条件 教师名字  coursetype中的id"),
            // 复用 查询条件 平台管理员增加：
            @ApiImplicitParam(name = "courseaudit", value = "平台管理员 非必要条件：课程审核状态  courseaudit"),
            @ApiImplicitParam(name = "courserecommended", value = "平台管理员 非必要条件 课程是否推荐  courserecommended"),
            @ApiImplicitParam(name = "coursestate", value = "平台管理员 非必要条件 课程状态  coursestate"),
            // 复用 排序的功能 台管理员增加： sort:排序 ,0=asc 1=desc
            @ApiImplicitParam(name = "sort", value = "平台管理员 非必要条件  排序方式 0=asc 1=desc"),
            @ApiImplicitParam(name = "SortBy", value = "平台管理员 非必要条件 排序用什么： 0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount"),
    })
    @GetMapping("/page")
    public PageMessage<Course> selectCoursePageBys(Course course, Long pagenum, Long pagesize, HttpServletRequest request) {
        PageMessage<Course> msg = new PageMessage<>();
        String token = request.getHeader("token");
        if (token == null || token.equals("")) {
            msg.setCode(-2);
            msg.setMsg("未获取到用户信息；可能登录超时");
            return msg;
        }
        Page<Course> CoursePage = service.selectCoursePageBy(course, pagenum, pagesize, token);
        if (CoursePage != null) {
            msg.setCode(1);
            msg.setPagedata(CoursePage);
        } else {
            msg.setCode(0);
            msg.setMsg("没有查询到数据");
        }
        return msg;
    }

    /**
     * 机构课程列表 数据接口
     */
    @ApiOperation("机构课程分页查询列表 ")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "没有加中文的可不填", value = "注意中文注解"),
            @ApiImplicitParam(name = "pagenum", value = "第几页"),
            @ApiImplicitParam(name = "pagesize", value = "每页多少行"),
            // 复用
            @ApiImplicitParam(name = "coursetitle", value = "非必要条件 模糊查询 课程名 coursetitle"),
            @ApiImplicitParam(name = "coursetypeid", value = "非必要条件 课程类型查询  coursetype中的id"),
            @ApiImplicitParam(name = "courseteachername", value = "非必要条件 教师名字  coursetype中的id"),
            // 复用 查询条件 平台管理员增加：
            @ApiImplicitParam(name = "courseaudit", value = "平台管理员 非必要条件：课程审核状态  courseaudit"),
            @ApiImplicitParam(name = "courserecommended", value = "平台管理员 非必要条件 课程是否推荐  courserecommended"),
            @ApiImplicitParam(name = "coursestate", value = "平台管理员 非必要条件 课程状态  coursestate"),
            // 复用 排序的功能 台管理员增加： sort:排序 ,0=asc 1=desc
            @ApiImplicitParam(name = "sort", value = "平台管理员 非必要条件  排序方式 0=asc 1=desc"),
            @ApiImplicitParam(name = "SortBy", value = "平台管理员 非必要条件 排序用什么： 0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount"),
    })
    @GetMapping("/page/org")
    public PageMessage<Course> selectCoursePageByOrg(Course course, Long pagenum, Long pagesize, HttpServletRequest request) {
        PageMessage<Course> msg = new PageMessage<>();
        String token = request.getHeader("token");
        if (token == null || token.equals("")) {
            msg.setCode(-2);
            msg.setMsg("未获取到用户信息；可能登录超时");
            return msg;
        }
        Page<Course> CoursePage = service.selectCoursePageBys(course, pagenum, pagesize, token);
        if (CoursePage != null) {
            msg.setCode(1);
            msg.setPagedata(CoursePage);
        } else {
            msg.setCode(0);
            msg.setMsg("没有查询到数据");
        }
        return msg;
    }

    /**
     * 系统
     *
     * @param course 非必要条件：
     *               模糊查询 课程名 coursetitle
     *               课程类型查询  course
     *               <p>
     *               添加条件:
     *               课程状态 -1--全部  0--未发布 1--发布 2--关闭；
     *               是否推荐 -1--全部 0--不推荐 1--推荐
     *               审核状态 -1--全部 0--未审 1--通过 2--未通过；
     *               <p>
     *               增加按（课程排序，课程评分，课程点击次数，评论次数）进行（asc/desc）排序的功能
     *               自定义 数据库中没有
     *               sort:排序 ,0=asc 1=desc
     *               SortBy:用什么排序 ,0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount。
     */
    @ApiOperation("课程分页查询列表 课程管理(系统)  (课程状态、是否推荐、审核状态)=-1时为全部")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "没有加中文的可不填", value = "注意中文注解"),
            @ApiImplicitParam(name = "pagenum", value = "第几页"),
            @ApiImplicitParam(name = "pagesize", value = "每页多少行"),
            // 复用
            @ApiImplicitParam(name = "coursetitle", value = "非必要条件 模糊查询 课程名 coursetitle"),
            @ApiImplicitParam(name = "coursetypeid", value = "非必要条件 课程类型查询  coursetype中的id"),
            // 复用 查询条件 平台管理员增加：
            @ApiImplicitParam(name = "courseaudit", value = "平台管理员 非必要条件：课程审核状态  courseaudi -1--全部 0--未审 1--通过 2--未通过"),
            @ApiImplicitParam(name = "courserecommended", value = "平台管理员 非必要条件 课程是否推荐  courserecommended -1--全部 0--不推荐 1--推荐"),
            @ApiImplicitParam(name = "coursestate", value = "平台管理员 非必要条件 课程状态  coursestate  -1--全部  0--未发布 1--发布 2--关闭"),
            // 复用 排序的功能 台管理员增加： sort:排序 ,0=asc 1=desc
            @ApiImplicitParam(name = "sort", value = "平台管理员 非必要条件  排序方式 0=asc 1=desc"),
            @ApiImplicitParam(name = "SortBy", value = "平台管理员 非必要条件 排序用什么： 0=课程评分 coursescore ，1=课程点击次数 coursepullcount，2=评论次数 coursecommentcount"),
    })
    @GetMapping("/page/sys")
    public PageMessage<Course> selectSysCoursePageBy(Course course, Long pagenum, Long pagesize, HttpServletRequest request) {
        PageMessage<Course> msg = new PageMessage<>();
        Page<Course> CoursePage = service.selectSysCoursePageBy(course, pagenum, pagesize);
        if (CoursePage != null) {
            msg.setCode(1);
            msg.setPagedata(CoursePage);
        } else {
            msg.setCode(0);
            msg.setMsg("没有查询到数据");
        }
        return msg;
    }

    @ApiOperation("创建课程")
    @PostMapping("/insert")
    @ApiImplicitParams({
            @ApiImplicitParam("有默认值的字段 可不传值"),
            @ApiImplicitParam(name = "coursestate", value = "课程状态 默认=0 未发布"),
            @ApiImplicitParam(name = "courseaudit", value = "课程审核状态 默认=0 未审核"),
            @ApiImplicitParam(name = "coursecreatetime", value = "课程创建时间 默认=当前时间"),
            @ApiImplicitParam(name = "courseupdatetime", value = "最后更新时间 默认=当前时间"),
            @ApiImplicitParam(name = "coursescore", value = "课程评分 默认评分为5。评分范围【0-10】"),
            @ApiImplicitParam(name = "coursepullcount", value = "课程点击次数 默认0"),
            @ApiImplicitParam(name = "courserecommended", value = "是否推荐 默认=0"),
            @ApiImplicitParam(name = "coursesort", value = "课程排序 默认=500（默认排序都为500）"),
            @ApiImplicitParam(name = "coursecommentcount", value = "评论次数 默认=0"),
            @ApiImplicitParam(name = "coursetypeid", value = "为了测试 课程类型 设置：1"),
            @ApiImplicitParam(name = "coursevaliddays", value = "课程过期时间 默认730"),
    })
    public BaseMessage insertCourse(Course course, HttpServletRequest request) {
        BaseMessage msg = new BaseMessage();
        String token = request.getHeader("token");
        int rtn = service.insertCourse(course, token);
        msg.setCode(rtn);
        if (rtn > 0) {
            msg.setMsg("创建课程成功");
        } else {
            msg.setCode(0);
            msg.setMsg("创建课程失败");
        }
        return msg;
    }


    @ApiOperation("完善课程信息接口、等价于修改课程信息")
    @ApiImplicitParam("修改课程信息信息 课程存在的情况下 根据课程id进行修改")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "courseid", value = "必传值 课程的id"),
            @ApiImplicitParam("没有中文注释的，根据前端的需要传值"),
    })
    @PostMapping("/update")
    public BaseMessage updateCourse(Course course) {
        int rtn = service.updateCourse(course);
        BaseMessage msg = new BaseMessage();
        msg.setCode(rtn);
        if (rtn > 0) {
            msg.setMsg("修改课程信息成功");
        } else {
            msg.setCode(0);
            msg.setMsg("修改课程信息失败");
        }
        return msg;
    }

    @ApiOperation("课程审核-系统管理员")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "courseid", value = "必传值 课程的id"),
            @ApiImplicitParam("没有中文注释的，根据前端的需要传值"),
    })
    @PostMapping("/update/Review")
    public BaseMessage updateCourseReview(Course course) {
        int rtns = service.updateCourse(course);
        BaseMessage msg = new BaseMessage();
        msg.setCode(rtns);
        if (rtns > 0) {
            msg.setMsg("修改课程信息成功");
        } else {
            msg.setCode(0);
            msg.setMsg("修改课程信息失败");
        }
        return msg;
    }


    @ApiOperation("根据课程id(courseid) 查询一条课程+课程类型数据(详细)")
    @GetMapping("/gets/{courseId}")
    public PojoMessage<CourseAndCourseTypeDto> selectCourseAndCourseTypeById(@PathVariable Integer courseId) {
        PojoMessage<CourseAndCourseTypeDto> msg = new PojoMessage<>();
        CourseAndCourseTypeDto course = service.selectCourseAndCourseTypeById(courseId);
        if (course != null) {
            msg.setCode(1);
            msg.setData(course);
        } else {
            msg.setCode(0);
            msg.setMsg("没有找到课程类型");
        }
        return msg;
    }

    @ApiOperation("查询所有可用的课程列表信息 临时后台管理用创建订单")
    @GetMapping("/list/Course")
    public ListMessage<Course> selectCourseLists() {
        List<Course> data = service.selectCourseList();
        ListMessage<Course> msg = new ListMessage<>();
        if (data != null) {
            msg.setCode(1);
            msg.setDatalist(data);
        } else {
            msg.setCode(0);
            msg.setMsg("没有找到课程列表信息");
        }
        return msg;
    }

    @ApiOperation("创建线下课程 ")
    @PostMapping("/inserts")
    @ApiImplicitParams({
            @ApiImplicitParam("有默认值的字段 可不传值"),
            @ApiImplicitParam(name = "coursestate", value = "课程状态 默认=0 未发布"),
            @ApiImplicitParam(name = "courseaudit", value = "课程审核状态 默认=0 未审核"),
            @ApiImplicitParam(name = "coursecreatetime", value = "课程创建时间 默认=当前时间"),
            @ApiImplicitParam(name = "courseupdatetime", value = "最后更新时间 默认=当前时间"),
            @ApiImplicitParam(name = "coursescore", value = "课程评分 默认评分为5。评分范围【0-10】"),
            @ApiImplicitParam(name = "coursepullcount", value = "课程点击次数 默认0"),
            @ApiImplicitParam(name = "courserecommended", value = "是否推荐 默认=0"),
            @ApiImplicitParam(name = "coursesort", value = "课程排序 默认=500（默认排序都为500）"),
            @ApiImplicitParam(name = "coursecommentcount", value = "评论次数 默认=0"),
            @ApiImplicitParam(name = "coursetypeid", value = "为了测试 课程类型 设置：1"),
            @ApiImplicitParam(name = "coursevaliddays", value = "课程过期时间 默认730"),
    })
    public BaseMessage insertCourses(CourseOfflineshowattrconfigDto courses, HttpServletRequest request) {
        BaseMessage msg = new BaseMessage();
        String token = request.getHeader("token");
        int rtn = service.insertCourses(courses, token);
        msg.setCode(rtn);
        if (rtn > 0) {
            msg.setMsg("创建线下课程成功");
        } else if (rtn == -2) {
            msg.setMsg("没有权限");
        } else {
            msg.setCode(0);
            msg.setMsg("创建线下课程失败");
        }
        return msg;
    }

    @ApiOperation("修改线下课程使用数据")
    @ApiImplicitParam("修改课程信息信息 根据课程id进行修改")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "courseid", value = "必传值 课程的id"),
            @ApiImplicitParam(name = "showconfigid", value = "显示课程的id"),
            @ApiImplicitParam("没有中文注释的，根据前端的需要传值"),
    })
    @PostMapping("/update/offline")
    @CrossOrigin
    public BaseMessage updateOfflineCourse(CourseOfflineshowattrconfigDto courses) {
        int rtn = service.updateOfflineCourse(courses);
        BaseMessage msg = new BaseMessage();
        msg.setCode(rtn);
        if (rtn > 0) {
            msg.setMsg("修改课程信息成功");
        } else {
            msg.setCode(0);
            msg.setMsg("修改课程信息失败");
        }
        return msg;
    }


    @ApiOperation("查询线下课程数据")
    @GetMapping("/offline/get/{courseId}")
    public PojoMessage<CourseOfflineDto> selectOfflineCourseById(@PathVariable Integer courseId) {
        PojoMessage<CourseOfflineDto> msg = new PojoMessage<>();
        CourseOfflineDto data = service.selectOfflineCourseById(courseId);
        if (data != null) {
            msg.setCode(1);
            msg.setData(data);
        } else {
            msg.setCode(0);
            msg.setMsg("没有找到课程");
        }
        return msg;
    }
}
